﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Web;
using SGS.Entidades;
using System.Data.SqlClient;
using SGS.Entidades.DTO;

namespace SGS.CamadaDados
{
    public class DesenvolvimentoDados : BaseConnection
    {

        public Desenvolvimento Salvar(Desenvolvimento objDesenvolvimento)
        {
            SqlCommand comando = new SqlCommand();
            comando.Connection = base.Conectar();


            if (!objDesenvolvimento.CodigoDesenvolvimento.HasValue)
            {
                comando.CommandText =
                    @"INSERT INTO Desenvolvimento (CodigoAssistido, Atividade, TipoAtividade,  DescricaoAtividade,
                                  Valor, DataInicio, DataFim, CargaHoraria, StatusAtividade)
                    VALUES (@codigoAssistido, @atividade, @tipoAtividade, @descricaoAtividade, @valor,
                           @dataInicio,@dataFim, @cargaHoraria, @statusAtividade)";
            }
            else
            {
                comando.CommandText =
                    @"UPDATE Desenvolvimento SET CodigoAssistido = @codigoAssistido, Atividade = @atividade,
                             TipoAtividade = @tipoAtividade, DescricaoAtividade = @descricaoAtividade, Valor = @valor,
                             DataInicio = @dataInicio, DataFim = @dataFim, CargaHoraria = @cargaHoraria, StatusAtividade = @statusAtividade
                             WHERE (CodigoDesenvolvimento = @codigoDesenvolvimento)"; 
            }

            comando.CommandType = System.Data.CommandType.Text;
            if (objDesenvolvimento.CodigoDesenvolvimento.HasValue)
            {
                SqlParameter parametroCodigo = new SqlParameter("@codigoDesenvolvimento", objDesenvolvimento.CodigoDesenvolvimento.Value);
                parametroCodigo.DbType = System.Data.DbType.Int32;
                comando.Parameters.Add(parametroCodigo);
            }

            SqlParameter parametroCodigoAssistido = new SqlParameter();
            if (objDesenvolvimento.CodigoAssistido.HasValue)
            {
                parametroCodigoAssistido.Value = objDesenvolvimento.CodigoAssistido.Value;
                parametroCodigoAssistido.ParameterName = "@codigoAssistido";
                parametroCodigoAssistido.DbType = System.Data.DbType.Int32;
            }
            else
            {
                parametroCodigoAssistido.Value = DBNull.Value;
                parametroCodigoAssistido.ParameterName = "@codigoAssistido";
                parametroCodigoAssistido.DbType = System.Data.DbType.Int32;
            }

            SqlParameter parametroAtividade = new SqlParameter("@atividade", objDesenvolvimento.Atividade);
            parametroAtividade.DbType = System.Data.DbType.String;

            SqlParameter parametroTipoAtividade = new SqlParameter("@tipoAtividade", objDesenvolvimento.TipoAtividade);
            parametroTipoAtividade.DbType = System.Data.DbType.String;

            SqlParameter parametroDescricaoAtividade = new SqlParameter("@descricaoAtividade", objDesenvolvimento.DescricaoAtividade);
            parametroDescricaoAtividade.DbType = System.Data.DbType.String;

            SqlParameter parametroValor = new SqlParameter("@valor", System.Data.DbType.Decimal);
            if (objDesenvolvimento.Valor.HasValue)
                parametroValor.Value = objDesenvolvimento.Valor;
            else
                parametroValor.Value = DBNull.Value;


            SqlParameter parametroDataInicio = new SqlParameter();
            if (objDesenvolvimento.DataInicio.HasValue)
            {
                parametroDataInicio.Value = objDesenvolvimento.DataInicio.Value;
                parametroDataInicio.ParameterName = "@dataInicio";
                parametroDataInicio.DbType = System.Data.DbType.DateTime;
            }
            else
            {
                parametroDataInicio.Value = DBNull.Value;
                parametroDataInicio.ParameterName = "@dataInicio";
                parametroDataInicio.DbType = System.Data.DbType.DateTime;
            }

            SqlParameter parametroDataFim = new SqlParameter();
            if (objDesenvolvimento.DataFim.HasValue)
            {
                parametroDataFim.Value = objDesenvolvimento.DataFim.Value;
                parametroDataFim.ParameterName = "@dataFim";
                parametroDataFim.DbType = System.Data.DbType.DateTime;
            }
            else
            {
                parametroDataFim.Value = DBNull.Value;
                parametroDataFim.ParameterName = "@dataFim";
                parametroDataFim.DbType = System.Data.DbType.DateTime;
            }

            SqlParameter parametroCargaHoraria = new SqlParameter("@cargaHoraria", System.Data.DbType.String);
            if (!String.IsNullOrEmpty(objDesenvolvimento.CargaHoraria))
                parametroCargaHoraria.Value = objDesenvolvimento.CargaHoraria;
            else
                parametroCargaHoraria.Value = DBNull.Value;

            SqlParameter parametroStatusAtividade = new SqlParameter("@statusAtividade", objDesenvolvimento.StatusAtividade);
            parametroStatusAtividade.DbType = System.Data.DbType.String;

            comando.Parameters.Add(parametroCodigoAssistido);
            comando.Parameters.Add(parametroAtividade);
            comando.Parameters.Add(parametroTipoAtividade);
            comando.Parameters.Add(parametroDescricaoAtividade);
            comando.Parameters.Add(parametroValor);
            comando.Parameters.Add(parametroDataInicio);
            comando.Parameters.Add(parametroDataFim);
            comando.Parameters.Add(parametroCargaHoraria);
            comando.Parameters.Add(parametroStatusAtividade);

            comando.ExecuteNonQuery();

            if (!objDesenvolvimento.CodigoDesenvolvimento.HasValue)
            {
                return ObterUltimo();
            }
            else
            {
                return objDesenvolvimento;
            }
        }

        /// <summary>
        /// Obtém o Desenvolvimento pelo Código do Desenvolvimento
        /// </summary>
        /// <param name="codigoDesenvolvimento"></param>
        /// <returns></returns>
        public Desenvolvimento Obter(int codigoDesenvolvimento)
        {
            SqlCommand comando = new SqlCommand("select * from Desenvolvimento where CodigoDesenvolvimento = @codigoDesenvolvimento", base.Conectar());
            SqlParameter parametroCodigoDesenvolvimento = new SqlParameter("@codigoDesenvolvimento", codigoDesenvolvimento);
            parametroCodigoDesenvolvimento.DbType = System.Data.DbType.Int32;
            comando.Parameters.Add(parametroCodigoDesenvolvimento);

            SqlDataReader leitorDados = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            Desenvolvimento objDesenvolvimento = null;

            if (leitorDados.Read())
            {
                objDesenvolvimento = new Desenvolvimento();

                objDesenvolvimento.CodigoDesenvolvimento = codigoDesenvolvimento;
                objDesenvolvimento.CodigoAssistido = Convert.ToInt32(leitorDados["CodigoAssistido"]);
                objDesenvolvimento.Atividade = leitorDados["Atividade"].ToString();
                objDesenvolvimento.TipoAtividade = leitorDados["TipoAtividade"].ToString();
                objDesenvolvimento.DescricaoAtividade = leitorDados["DescricaoAtividade"].ToString();
                if (leitorDados["Valor"] != DBNull.Value)
                    objDesenvolvimento.Valor = Convert.ToDecimal(leitorDados["Valor"]);
                if (leitorDados["DataInicio"] != DBNull.Value)
                    objDesenvolvimento.DataInicio = Convert.ToDateTime(leitorDados["DataInicio"]); ;
                if (leitorDados["DataFim"] != DBNull.Value)
                    objDesenvolvimento.DataFim = Convert.ToDateTime(leitorDados["DataFim"]); ;
                objDesenvolvimento.CargaHoraria = leitorDados["CargaHoraria"].ToString();
                objDesenvolvimento.StatusAtividade = leitorDados["StatusAtividade"].ToString();

            }

            leitorDados.Close();
            leitorDados.Dispose();

            return objDesenvolvimento;
        }

        public Desenvolvimento ObterUltimo()
        {
            SqlCommand comando = new SqlCommand(@"SELECT TOP (1) * FROM Desenvolvimento ORDER BY CodigoDesenvolvimento DESC", base.Conectar());
            SqlDataReader leitorDados = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            Desenvolvimento objDesenvolvimento = null;

            if (leitorDados.Read())
            {
                objDesenvolvimento = new Desenvolvimento();

                objDesenvolvimento.CodigoDesenvolvimento = Convert.ToInt32(leitorDados["CodigoDesenvolvimento"]);
                objDesenvolvimento.CodigoAssistido = Convert.ToInt32(leitorDados["CodigoAssistido"]);
                objDesenvolvimento.Atividade = leitorDados["Atividade"].ToString();
                objDesenvolvimento.TipoAtividade = leitorDados["TipoAtividade"].ToString();
                objDesenvolvimento.DescricaoAtividade = leitorDados["DescricaoAtividade"].ToString();
                
                if (leitorDados["Valor"] != DBNull.Value)
                    objDesenvolvimento.Valor = Convert.ToDecimal(leitorDados["Valor"]);
                
                objDesenvolvimento.CargaHoraria = leitorDados["CargaHoraria"].ToString();
                objDesenvolvimento.StatusAtividade = leitorDados["StatusAtividade"].ToString();

                if (leitorDados["DataInicio"] != DBNull.Value)
                    objDesenvolvimento.DataInicio = Convert.ToDateTime(leitorDados["DataInicio"]);

                if (leitorDados["DataFim"] != DBNull.Value)
                    objDesenvolvimento.DataFim = Convert.ToDateTime(leitorDados["DataFim"]);



            }

            leitorDados.Close();
            leitorDados.Dispose();

            return objDesenvolvimento;
        }

        /// <summary>
        /// Exclui um Desenvolvimento pelo seu código
        /// </summary>
        public bool Excluir(int codigoDesenvolvimento)
        {
            bool execucao;

            SqlCommand comando = new SqlCommand("delete from Desenvolvimento where CodigoDesenvolvimento = @codigoDesenvolvimento", base.Conectar());

            SqlParameter parametroCodigoDesenvolvimento = new SqlParameter("@codigoDesenvolvimento", codigoDesenvolvimento);
            parametroCodigoDesenvolvimento.DbType = System.Data.DbType.Int32;
            comando.Parameters.Add(parametroCodigoDesenvolvimento);

            execucao = Convert.ToBoolean(comando.ExecuteNonQuery());

            return execucao;
        }

        public List<DesenvolvimentoAssistidoDTO> Consultar(DesenvolvimentoDTO objDesenvolvimentoDTO)
        {
            SqlCommand comando = new SqlCommand();
            comando.Connection = base.Conectar();

            SqlDataReader leitorDados;

            SqlParameter paramAssistidoValor = new SqlParameter("@assistidoValor", System.Data.SqlDbType.Int);
            if (objDesenvolvimentoDTO.AssistidoValor.HasValue)
                paramAssistidoValor.Value = objDesenvolvimentoDTO.AssistidoValor.Value;
            else
                paramAssistidoValor.Value = DBNull.Value;

            SqlParameter paramAtividadeValor = new SqlParameter("@atividadeValor", "%" + objDesenvolvimentoDTO.AtividadeValor + "%");
            paramAtividadeValor.DbType = System.Data.DbType.String;

            SqlParameter paramDataInicioValor = new SqlParameter("@dataInicioValor", System.Data.SqlDbType.DateTime);
            if (objDesenvolvimentoDTO.DataInicioValor.HasValue)
                paramDataInicioValor.Value = objDesenvolvimentoDTO.DataInicioValor.Value;
            else
                paramDataInicioValor.Value = DBNull.Value;

            SqlParameter paramDataFimValor = new SqlParameter("@dataFimValor", System.Data.SqlDbType.DateTime);
            if (objDesenvolvimentoDTO.DataFimValor.HasValue)
                paramDataFimValor.Value = objDesenvolvimentoDTO.DataFimValor.Value;
            else
                paramDataFimValor.Value = DBNull.Value;


            String sql = "select * from Desenvolvimento PR inner join Pessoa P on P.CodigoPessoa = PR.CodigoAssistido";

            //Se o Assistido, Atividade, Data Inicio e Data Fim preenchidos
            if (objDesenvolvimentoDTO.AssistidoValor.HasValue && objDesenvolvimentoDTO.AtividadeValor != "" && objDesenvolvimentoDTO.DataInicioValor.HasValue && objDesenvolvimentoDTO.DataFimValor.HasValue)
                sql += @" where CodigoAssistido = @assistidoValor and Atividade like @atividadeValor and DataInicio >= @dataInicioValor and DataFim <= @dataFimValor";

            //Se apenas Assistido e Atividade preenchidos
            else if (objDesenvolvimentoDTO.AssistidoValor.HasValue && objDesenvolvimentoDTO.AtividadeValor != "")
                sql += @" where CodigoAssistido = @assistidoValor and Atividade like @atividadeValor";

            //Se apenas Atividade e Data Inicio preenchidos
            else if (objDesenvolvimentoDTO.AtividadeValor != "" && objDesenvolvimentoDTO.DataInicioValor.HasValue && objDesenvolvimentoDTO.DataFimValor.HasValue)
                sql += @" where Atividade like @atividadeValor and DataInicio >= @dataInicioValor and DataFim <= @dataFimValor  ";

            //Se apenas Atividade e Data Inicio preenchidos
            else if (objDesenvolvimentoDTO.AtividadeValor != "" && objDesenvolvimentoDTO.DataInicioValor.HasValue)
                sql += @" where Atividade like @atividadeValor and DataInicio >= @dataInicioValor";

            //Se apenas Data Inicio e Data Fim preenchidos
            else if (objDesenvolvimentoDTO.DataInicioValor.HasValue && objDesenvolvimentoDTO.DataFimValor.HasValue)
                sql += @" where DataInicio >= @dataInicioValor and DataFim <= @dataFimValor";

            //Se apenas Data Fim e Assistidos preenchidos
            else if (objDesenvolvimentoDTO.DataFimValor.HasValue && objDesenvolvimentoDTO.AssistidoValor.HasValue)
                sql += @" where DataFim <= @dataFimValor and CodigoAssistido = @assistidoValor";

            //Se apenas Data Fim preenchido
            else if (objDesenvolvimentoDTO.DataFimValor.HasValue)
                sql += @" where DataFim <= @dataFimValor";

            //Se apenas Assistido preenchido
            else if (objDesenvolvimentoDTO.AssistidoValor.HasValue)
                sql += @" where CodigoAssistido = @assistidoValor";

            //Se apenas Data Inicio preenchida
            else if (objDesenvolvimentoDTO.DataInicioValor.HasValue)
                sql += @" where DataInicio >= @dataInicioValor";

            //Se apenas Atividade preenchida
            else if (objDesenvolvimentoDTO.AtividadeValor != "")
                sql += @" where Atividade like @atividadeValor";

            if (sql.Contains("where"))
                sql += " and P.Ativo = 1";
            else
                sql += " where P.Ativo = 1";

            comando.CommandText = sql;
            comando.CommandType = System.Data.CommandType.Text;
            comando.Parameters.Add(paramAssistidoValor);
            comando.Parameters.Add(paramAtividadeValor);
            comando.Parameters.Add(paramDataInicioValor);
            comando.Parameters.Add(paramDataFimValor);

            leitorDados = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);



            List<DesenvolvimentoAssistidoDTO> procedimentosAssistidoDTOLista = new List<DesenvolvimentoAssistidoDTO>();
            DesenvolvimentoAssistidoDTO objDesenvolvimentoAssistidoDTO;

            while (leitorDados.Read())
            {
                objDesenvolvimentoAssistidoDTO = new DesenvolvimentoAssistidoDTO();

                objDesenvolvimentoAssistidoDTO.NomeAssistido = leitorDados["Nome"].ToString();
                objDesenvolvimentoAssistidoDTO.CodigoDesenvolvimento = Convert.ToInt32(leitorDados["CodigoDesenvolvimento"]);
                objDesenvolvimentoAssistidoDTO.CodigoAssistido = Convert.ToInt32(leitorDados["CodigoAssistido"]);
                objDesenvolvimentoAssistidoDTO.TipoAtividade = leitorDados["TipoAtividade"].ToString();
                objDesenvolvimentoAssistidoDTO.Atividade = leitorDados["Atividade"].ToString();
                objDesenvolvimentoAssistidoDTO.DescricaoAtividade = leitorDados["DescricaoAtividade"].ToString();
                objDesenvolvimentoAssistidoDTO.StatusAtividade = leitorDados["StatusAtividade"].ToString();
                if (leitorDados["Valor"] != DBNull.Value) 
                    objDesenvolvimentoAssistidoDTO.Valor = Convert.ToDecimal(leitorDados["Valor"]);
                
                objDesenvolvimentoAssistidoDTO.CargaHoraria = leitorDados["CargaHoraria"].ToString();

                if (leitorDados["DataInicio"] != DBNull.Value)
                    objDesenvolvimentoAssistidoDTO.DataInicio = Convert.ToDateTime(leitorDados["DataInicio"]);

                if (leitorDados["DataFim"] != DBNull.Value)
                    objDesenvolvimentoAssistidoDTO.DataFim = Convert.ToDateTime(leitorDados["DataFim"]);

                procedimentosAssistidoDTOLista.Add(objDesenvolvimentoAssistidoDTO);
            }

            return procedimentosAssistidoDTOLista;
        }

    }
}